I'd step back and ask if you actually need shared state across all three groups. In my experience, this problem usually means the boundaries are wrong.
Auth belongs in middleware/a single provider. User prefs and feature flags? Those are often better as server-side queries (database or cache hit on each route) rather than context. You pay a small perf cost upfront, avoid re-render cascades, and server components actually handle it cleanly.
If you must coordinate, Zustand works fine with the client boundary pattern. Wrap just the routes that need it, not the whole app. The "awkwardness" goes away once you stop fighting the server/client split.
Backend dev obsessed with distributed systems