I didn't think that was possible.
With that said, C# almost always breaks forward compatibility. It seems like a somewhat odd design goal to have for a language nowadays.
It would be great if somebody who knows one way or the other for sure chimed in.
However the C# compiler will produce bytecode compatible with the .NET 2.0 runtime from C#3-code. And all C#2 code will compile just fine with the C#3 compiler.
Basically what breaks is trying to shove C#3 code through a C# 2 compiler, and that can hardly be said to surprise anyone.
The part which may be confusing is that unlike Java and the JVM, C# is tied to CLR runtimes, and you can have several installed at the same time.
C#1 was tied to the .NET 1.x runtime. C#2 was tied to the .NET 2.x runtime (which also powered .NET 3.0 and .NET 3.5). C#3 was tied to the .NET 2.x runtime with some extra LInQ DLLs installed (aka .NET 3.5). C#4 (which again adds more features) depends on the .NET 4.x runtime. And all these runtimes can be installed at the same time.
The fact that Microsoft is willing to "leave old runtimes behind" and create new ones when the language features being requested requires it means they can iterate much faster than the Java can, since backwards bytecode compatibility is not required.
I think it is a decision which has worked out largely to their advantage.
http://blogs.msdn.com/b/ericlippert/archive/2011/11/07/break...
The only one I can think of is the upcoming change in closure semantics for loop variables - something that is being changed to make it work like people would expect for 99% of the case and risks breaking that 1% of cases where someone actually wants the same loop variable to be closed over in all functions defined within the loop.
(e.g. Linq is actually much like a monad with SelectMany as bind)
Correct me if I'm wrong but I believe, with SelectMany, Linq does in fact, provide everything required to support monads.
Agree with everything else you said - especially on flawed comparisons between the two languages.