It has the appearance of being free and open, but a lot of the framework is not and has aggressive licenses.
It's easy to creep into those bits unintentionally via ignorance or dependency and then you're stuck with the vendor's extensions (MS) which are hard to shake.
(I've been a C# developer since pre-beta days so I'm fairly experienced at getting shot by these things).
Java is pretty much open, there are several implementations and most components in their stacks and application stacks on top are 100% pluggable (including J2EE). The same is not the case for anything which involves WCF, ASP.Net etc.
Ideally ANSI common lisp would be better as there are several competing implementations and one core standard.
Common lisp isn't all that functional TBH (it can be if you want it to be though)
That being said unless it's just a quick hack for myself I tend to stray from C# due to it not being usable on all platforms.
That says something about the portability and consistency of Java, rather than the ability of c#.
The reverse is not possible due to the platform lock in.