Why did microsoft's developers choose to make the .NET a stack based machine?

Keep in mind that just because the intermediate representation is stack-based it doesn't mean the generated machine code is stack-based. As the code is converted from the intermediate form to machine code it's basically recompiled - allowing for local optimizations.

Once nice thing about using a stack-based intermediate representation is that you're not tied to any specific architecture.

Imagine if they had decided to use a theoretical register-based system as their intermediate form. How many registers should they pick? 8? 16? 64? If your target processor has more actual registers than the intermediate form then you've lost out on possible optimizations. If your target has less actual registers than the intermediate then your optimizations are counter-productive because those registers are flushed to memory anyway.

Even on current CPUs you've got a big difference compiling down to x86 vs x64 - not to mention alternate architectures (ARM) or future architectures.

For something like this it's good that they kept it in the simplest form and then rely on optimization during final code generation to match it to the actual hardware.