imho, there is nothing brilliant in the fact that you can run other languages on the jvm. you can run many different languages on your OS as well. but i think that using simple bytecode as a native language of the jvm has helped a lot. it's easier to translate/compile languages to simple bytecode rather than to other high-level language. very recently the jvm specification noticed the existence of other languages and added invoke-dynamic which is currently accessible only from the bytecode (no java construct for that).
but the jvm also enforces a lot of limits. for example you can't benefit from tail call optimization; startup time is a disaster so you need cheats (always running daemon) to use it efficiently for a scripting language; debugging stacktraces of non-java languages is a nightmare; haskell is still not ported to jvm because of technical difficulties and completely different evaluation models
i think the jvm is brilliant because (after a years) it's really fast (GC, JIT) stable, portable, with huge market penetration and zillions of libraries. so you write once and later run on your pc, server, phone, tv and washing machine.
why not .NET nor C? i guess: portability, price, luck. most servers are non-windows. it's cheaper to start with java than .NET. C is not portable, doesn't have GC