When an account name is registered on the blockchain, if a pay rate between 0-100 is specified then that account becomes registered as a delegate. Each delegate has a variable amount of stake voting for them. If a delegate has enough votes where the total stake voting for them is in the top 101 vote balances out of the set of registered delegates, then that delegate node will be included in each round as an active block signer. When these vote balances change, i.e. a delegate has votes revoked and are "fired" from the top 101, each client will sync that information and reflect the new set of active 101 delegates accordingly.
So the list of delegates is a list that doesn't get any smaller, only larger, as new delegate accounts are registered. The set of active delegates is dynamic based on the amount of stake each delegate has voting for them. Anyone can change their vote and their changes will be reflected when that trx is included in the next block. To change your vote, send a transfer (to yourself for example). There are multiple voting schemes you can specify when you transfer your stake: vote_none, vote_all, vote_random, and vote_recommended. The GUI client has a vote button to make this process simpler.
The default is "vote_recommended", which I believe means that your votes are cast based on the voting slates published by the delegates that you approve of.