What makes a good OS is a language that keep code tight and still allow you to express your computations without hinderence. The programmer has to some vision as to what is needed, and what should be left out. And the courage to think through the system as a whole both for present needs, and future possibilities.
Selecting a tool that is "easy to work with" with no thought on code produced from it. Nor thinking through "do I need this?" or "what is the best way to do this?".. "are ALL possibilities covered?" is a recipe for bloat and "mystery errors and magical fixes".
I think C is neat combined with assembler for those really tight sections. Then it's a question of deciding the bare minimum while still have a framework for stable and tight expansion. So your OS doesn't expect all storage devices to be of the floppy type or can't handle more than X bytes of RAM etc. Or gets horrible slow from expansion due to bad data structure design and evaluation.