Here are some of the reasons I can think of off the top of my head:
- Different container formats (which so far seems to be the leading differentiator in this answer -- however its not the only reason).
- different dynamic linker semantics.
- different ABI.
- different exception handling mechanisms -- windows has SEH -- upon which C++ exception handling is built
- different system call semantics and different system calls -- hence different low-level libraries.