Try this:
string ReceivedDateTimeString = "2012-10-09T07:42:13.409191Z";
DateTime TransformedReceivedDateTimeString =
DateTime.ParseExact(ReceivedDateTimeString,
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFFK",
CultureInfo.InvariantCulture,
DateTimeStyles.RoundTripKind);
The documentation for the "o" format specifier states that:
The "O" or "o" standard format specifier corresponds to the "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK" custom format string for DateTime values and to the "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz" custom format string for DateTimeOffset values.
I.e. 7 decimals, not 6 as in your string.
The formatted string can be parsed back by using the DateTimeParse(String, IFormatProvider, DateTimeStyles) or DateTimeParseExact method if the styles parameter is set to DateTimeStyles.RoundtripKind.
I.e. you need to specify DateTimeStyles.RoundtripKind.
In the above, I've used "FFF..." rather than "fff..." as this will accept a variable number of decimals (missing trailing decimals are treated as zero). This is to conform to the principle of being "tolerant on input, strict on output".
Also I've specified DateTimeStyles.RoundtripKind to preserve the Kind property when parsing (Utc in this case). If you don't do this, the result will be converted to local time.