The arrival of mono solved this issue in a perfect way. Although many people believe Java is somehow more portable, they're wrong. All mono including the big, big class library is 100% cross platform compatible between Windows and Linux. There are some libraries, that mono depends on, but more and more get replaced by 100% C# code (like for example the MySQL and PostgreSQL data providers.
Thanks to binary compatibility you can simply copy a binary compiled on Windows to Linux. Examples are a complete compiler (MCS) and others. Sometimes application need to p/invoke against native libraries, but this is also the case with Java, and it will get fewer and fewer, the more libraries get ported to C#.
That being said you can easily destroy that portability, if you use certain unportable code parts. This chapters will tell you anything you kneed to know, and then maybe you just copy your application developed on Windows to Linux or MacOS X and it will just work.