Also the idea of an OS is a bit of an issue these days as it seems to cover everything from the hardware management through API functionality, the GUI and even things that could traditionally be treated as an application or addon (IIS, Messenger, IE etc)
Low level stuff (parts of the kernel, parts of device drivers, HAL) will need some assembler to handle the underlying CPU etc.
Other parts of the kernel and the API could be C or C++ although C++ may incur too much overhead in some places.
C++ can make the application side of things easier than C though.
However C++, C and assembler also require a very indepth knowledge of the language and its quirks as well as involving quite a lot of manual coding to deal with memory management (leaks and Dr watsons are very easy to come by)
C# (or VB.Net or any other .Net language) can provide a much quicker development environment and also make some of these issues less of a problem (not removed though)
As to writting a C/C++ compiler these things tend to evolve - the earliest C compilers would have been written in assembler (probably) as these compilers and the language itself matured then later compilers would have been written in C.
The first C++ compilers were really parsers that took C++ code and generated C code that did the same thing which was then fed through a C compiler, over time these became real C++ compilers. Again as the benefits became apparent then the C++ compilers would have been migrated over from C to C++.