Do the individual miners [...] choose which transactions to include in their block
According to the relevant website:
Stratum V2 is the next generation protocol for pooled mining. It increases security, makes data transfers more efficient, and reduces mining infrastructure requirements. It also introduces three new sub-protocols that let miners select transaction sets and improve decentralization by negotiating with pools.
(my emphasis)
Job Negotiation Protocol
A Miner's Template Provider negotiates a block template (which includes the transaction set) with a Pool's Job Negotiator. The Pool can reuse negotiation outcomes across all end-miner connections to reduce computational intensity. A single negotiation can multicast to multiple farms with hundreds of thousands of devices. This protocol is a separate, optional piece of infrastructure from the Mining Protocol and can be provided as a 3rd party service for mining farms. Separating job negotiation as a sub-protocol lets pools terminate negotiation connections independently of mining protocol connections (i.e. share submissions). Work negotiation likely requires, at minimum, validity spot-checks and (potentially) rate-limiting.
The details are at https://github.com/stratum-mining/sv2-spec/blob/main/06-Job-Negotiation-Protocol.md which includes
6.1.4 CommitMiningJob (Client -> Server)
A request sent by the Job Negotiator that proposes a selected set of transactions to the upstream (pool) node.
Field Name |
Data Type |
Description |
request_id |
U32 |
Unique identifier for pairing the response |
mining_job_token |
B0_255 |
Previously reserved mining job token received by AllocateMiningJobToken.Success |
[etc]
So yes, miners can negotiate with the pool about the transactions the miner would like to include in the block. Note that support for this is described as optional. Perhaps some pools don't support the job negotiation sub-protocol.