The real problem is that showing a user what NFTs they own requires an indexing service.
Each NFT collection is represented by its own smart contract. So the only way to show a user what NFTs they have is to either iterate over all of the ERC721 contracts on the blockchain and iterate over all of the tokenIds calling `ownerOf()` for each one (millions upon millions of tokenIds to iterate through) or to maintain an indexing service that listens for transfer and mint events and updates state continuously for every wallet address.
Another issue is that someone can send an NFT to an address with or without being requested, just like an email can be sent with or without being requested. On cheaper networks, spam NFTs are a real problem. So OpenSea will hide NFTs unless they're from a reputable collection.
In my opinion, OpenSea's key strength is their indexing service. Beating OpenSea in a decentralized manner will require a decentralized indexer. Protocols like The Graph (https://thegraph.com/en/) are an example of how to do that in a decentralized way.