In the case of macOS, the company developing it only have to worry about a limited set of possible hardware devices, that they are even designed by them, or tightly approved what components have them on (like sound or wifi chipsets). In the case of Windows, the manufacturers of the devices, usually not Microsoft, are the ones that should make the drivers for their own components, knowing all of internals, and of course, the makers of the computers/laptops being sure that everything works well. And in those cases, usually the OS is already installed by the time it reaches the consumer. But in the case of Linux, you have independent developers trying to reverse engineer, figure out how to interact using sometimes incomplete or outdated specs, and the mix and match of devices in a model of computer may not be all covered. And you have to install linux on it.
Unless, like with Windows and MacOS, you buy a computer designed for and builtin around Linux with it preinstalled, where everything "just works" (depending on how serious about it is the manufacturer, at least).
Regarding software, instead of an homogeneous set of core libraries, rules of user interaction, ways to interact between core applications and so on, you have independently developed applications, frameworks, versions, redesigns and so on, it gives you far more choices, more ways to mix and match the components to make a solution for you, but it may not be consistent, not the same development rate, and you may hit some compatibility issues between versions. Distributions do some work around this, at least for their core apps, but you have too much options, and the applications may not be aware of others or meant to be run in just one distribution and way to do things.
Also, the traditional profile of the user used to be more technically minded one, so the design of a lot of components allow more fine tuning and configuration, at the cost of the usability of having just a few ways to behave. But that mix and match leaves space for misbehaving too. There had been some developments to avoid i.e. libraries conflicts, like snaps, but consistency and interaction between apps and frameworks of different developers may not be always perfect.