Decentralized exchanges for fungible assets already exist and work extremely well (and I prefer to centralized exchanges whenever possible), such as Uniswap (https://app.uniswap.org/#/swap), Curve (https://curve.fi/), and Sushi (https://app.sushi.com/en/swap).
Decentralized exchanges for NFTs are being worked on. No one has quite nailed the full end-to-end user experience yet, but it will happen. It's inevitable.
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.