Según tengo entendido es un ejecutable normal hasta cierto punto y luego este lo que hace es enviar el codigo IL que posee al JIT.
En efecto el CLR de mono también los puede ejecutar pues me imagino que hay algún marcador o bandera que indica que el archivo contiene código intermedio y desde donde comienza ese código.
en todo caso , para poder ejecutar un programa creado con .net o con cualquier CLR se debe tener un runtime de alguno de los CLR disponibles ( mono, .net , boo o el que sea.)