Mono does give you the ability to run C# code everywhere. So, correct, it's not the language itself that's preventing you to write C# once, run everywhere. Perhaps you understood where I was going in the first place?
Anyway, people choose Java because they can write once and deploy everywhere. If you write in the C# .Net ecosystem on Windows, it won't run everywhere, which is fine if Windows is your only target.
I don't understand where you're going, no. I write C# on Windows and deploy to Linux and Mac pretty regularly. I know someone who writes C# on Windows and deploys to Arduino.
C# seems to be roughly as portable as Java does to me these days. I'm sure I could be wrong, which is why I'm asking which places you can run Java that you can't run C#. Yes, you can write non-portable C# code, but you can write non-portable code in every language.
I mostly do web & server-side development so I'm not sure my opinion is going to be terribly valuable there. However, I think many people use GTK# because it's the most mature.
I think it's also that more people trust the (openjdk/sunjdk) as a high performance vm with tons of money spent on developing an excellent gc and jit with a ton compared to mono. Although on the other hand its true that many people use an interpreter/vm like ruby 1.8 without much trouble.