Couple issues here:
1) make sure to notice that the original string includes a timezone offset of -04:00, so it's not in UTC format. The UTC version of the same point in time would obviously be 2010-03-15T04:00:00Z (ending Z means UTC / Zulu). When you then displayed the DateTime, it shows the local timezone version - since your local timezone is EST (-5), then it displays 1 hour before what appears in the original string (which was offset @ -4), hence the 11:00pm
2) it sounds like your goal here isn't to show the local timezone nor UTC versions of the timestamp, but instead keep it at the same offset as what the input string had specified. Luckily 3.5 added a type just for this kind of scenario: DateTimeOffset
if you were to use DateTimeOffset instead of DateTime, the default ToString output would then be:
[342] C:\ » $dto = [datetimeoffset]::parse('2010-03-15T00:00:00-08:00')
[343] C:\ » $dto.ToString()
3/15/2010 12:00:00 AM -08:00
[344] C:\ » $dto.DateTime.ToString()
3/15/2010 12:00:00 AM
Notice that it keeps both the same time and knowledge of the offset (hence the name of the type). If you don't care about the offset and just want to get the DateTime for whatever offset the input was in, you can just fetch the DateTime property (as shown above). If you need to stick with a DateTime and can't or don't want to switch to DateTimeOffset, this may be the way to go.