The problem, is the league isn’t a collective. They have limited revenue sharing, but since the revenue is distributed unevenly, they have to force the players into a collective in order to control costs. If the league shared revenue, and required player salaries to be paid out of that revenue, then there would be no need to impose salary caps.
For all intents and purposes the player salaries are paid out of the shared revenue. If you take the total amount of the TV contracts (shared revenue) and divide by 32 (number of teams) you get a number that’s right in the ball park of the cap. And that doesn’t even count the visiting ticket gate and a few other revenue streams that are shared.