Why can't a compiler create universal N-bit code (e.g. 32-bit, 64-bit, etc.)
The instruction set for a 32-bit processor is different from the instruction set for a 64-bit processor.  The 64-bit instructions can't be executed on a 32-bit processor.  So, the program really does need to be compiled to something different: if you take a program compiled for a 64-bit processor, and try to run it on a 32-bit processor, the processor won't run it, because it doesn't understand the new 64-bit instructions.