From the code, I gather it has a list of initial seed nodes to download updated lists from. I assume that it is important for the integrity of the network that these hardcoded seed nodes are not compromised or can't easily become subject to persecution from hostile goverments / agents.
Not really. They could all be taken down tomorrow and existing nodes would be unaffected. New nodes would have difficulty bootstraping but that could be worked around temporarily by having new users manually adding known nodes to the config file. All a new node needs is a few nodes to connect to as part of the connection handshake involves both nodes sharing their list of known nodes. So if you known 3 or 4 nodes, you soon know thousands. All networks have to be bootstrapped in some way. Of course the goal would be to ensure there are enough bootstraps (both in dns seeds and hardcoded nodes) to make disrupt nearly impossible.
In addition to the dns seeds there is a list of very active high uptime nodes which are hardcoded to the client
https://github.com/bitcoin/bitcoin/blob/b8d9058a4d1ce28eefa65aa3339bcc52b3c014e9/src/chainparams.cpp#L21This list is updated from version to version. Peers are monitored to find the ones with the most connections, uptime, and synced bandwidth. This ensures that even if the dns seeds are offline, new nodes can always find a few reliable, well connected nodes. Maintain good uptime and large number of inbound connections and you might find your node on that list.
As for miners. Nodes don't advertising if they are mining or not. The network doesn't treat miners any different than other nodes. You don't (normally) send transaction to a miner. You just relay them to your peers who relay them to their peers, etc. Within a few hops every node knows of the new transactions.