I found a solution that wasn't exactly clean but it worked. Basically i move the UTC time of my appointment to the location of the meeting. I had the offset and the name of the city. It's not very clean because I'm looking for a contain in the display name of the TimeZoneInfo.
List<TimeZoneInfo> viableTimezones = new List<TimeZoneInfo>();
foreach (TimeZoneInfo timeZone in timeZones)
{
TimeSpan q = new TimeSpan(givenTimespawn);
if (timeZone.BaseUtcOffset == q && timeZone.DisplayName.Contains(CityVenue))
{
viableTimezones.Add(timeZone);
}
}
var endDate = new DateTime(Year, Month, Day, Hour, min, secs );
var actualEndUTC = TimeZoneInfo.ConvertTimeToUtc(endDate, viableTimezones[0]);
If i do this i get the UTC time of the event (the one that i have in the crm needs to be assembled from Date and Time, than moved to the venue location and finally i'm able to recover the UTC time to write that one directly inside the ics file. I discovered that a simple Z at the end (Zulu), gives the UTC value to the calendar appointment that is than moved to the user timezone.