Build one generic repository that handles CRUD for every entity, extend it per-aggregate for the queries that do not fit, and wire it into a Clean Architecture solution with MediatR and PostgreSQL.
Put validation in a MediatR pipeline behavior so every command is checked before its handler runs - no validation calls in handlers, no validation logic in endpoints.