The only difference is that only programs that fully uses userspace works, and anything that uses kernel driver will fail miserably. In this sense, games worked out the best because they usually have high level of independence and self-contained, with hardware abstraction layers to make things highly compatible.
If you want to talk about similar stuff, FreeBSD have a Linux compatibility layer similar to Wine. You can use that as a reference, despite both FreeBSD and Linux use ELF, and Windows use PE.
But to be honest at the end of the day, it's just program header describing code sections, library imports/exports and relocations, and this is why you can run Windows app on Linux basically untouched, given you can reverse engineer userspace Windows API calls 100% precisely.
And the legal aspect of it, well...
Also, there is a project called Winlator (https://github.com/brunodev85/winlator) that combines Wine + Box64/Box86 to run x86 games on Wine on Android. Now that is what I call an emulator since Box64/Box86 really is one.