I think the actual answer you are looking for is "sort of ... in a way". The way that C# works is less like normal (native) executables that you would run on your Linux or windows machine, and more like Java.
With normal executables, your compiler compiles the code and produces a native executable, and then your OS loads that executable and runs it. However, in C#, you compile to CLI (common language infrastructure) code, then your Common Language Runtime (mono on linux, .net on windows) loads that code, and compiles the parts that it needs while it is running (JIT compilation).
So the platform dependent parts are taken care of by either mono or .net when you run the executable.
The reason you can run the executable in linux using ./myprog.exe instead of mono myprog.exe is because the linux kernel has a feature called misc-executables, which basically sees that you are running a c# program and instead of trying to load non-native code, it loads an interpreter program (mono or wine depending on you your system is configured).
So I say that it is "sort of" cross platform because the native code is still platform dependent. But a c# application is not native code, so it actually can't run directly on any system (it will not run on my computer because I have neither wine nor mono installed). However, as long as a good enough CLR (common language runtime) implementation exists on the system, it should work. So it is cross platform in the sense that it can run on any CLR platform (because the CLR what does the loading and executing, NOT the OS).
Additionally, don't be confused by the program's extension (.exe), this does not denote the type of the file. People often see .exe and assume that means its a windows executable (PE executable), but in this case that is not true, its a CLI executable. Under linux, the extension is basically meaningless, linux (almost) completely ignores it. Linux determines if a program is an executable or not based on the executable flag in the file attributes. Most Linux native executables (ELF executables) do not have any extension. I believe though that (depending on how your system is configured), linux's misc-executable system might use the extension to determine that wine or mono is needed to execute your C# application.