Hardcoding relays as initial defaults for different purposes on clients isn't worse than fetching lists from the user or from NIP-50 relay lists of friends, it's just a recommended list coming directly from the client developer to the user, and the user presumably has a trust relationship to the client developer already.
Discussion
Let me share my thinking out loud thoughts...
I think selecting relays depends on the purpose / goal in the client. For some clients a hardcoded list will work as the best solution (when it's a microservice client trying one thing at best with a one-kind specific relay) and for other clients which are doing a lot of different stuff around multiple event kinds they would use a dynamic relay selection (and this is where it gets complicated and you inititally define the biggest relays which are transmitting all the events).
I would argue a relay selection should be context-aware. I'm sure this topic is already often discussed in the NIPs repo? (which I should follow more tbh)
very sensible point and I think it should be voiced more, most people think of relays as these free abusable dumb databases still