Mining does have strong indicators though: mining memory access is nothing like memory access for a game or application.
Normal games and applications won't just max the whole memory bus at 100% for hours and hours. Even in a high-load situation it will still bounce around 90-100% or whatever. Mining absolutely slams the memory bus 100%, because current implementations are Proof Of Bandwidth so that's the stat you need to maximize.
Normal games or applications will go out of their way to align threads in a warp to access contiguous memory blocks ("coalesced memory access"), because that can be efficiently handled as a single request and broadcast to every thread. Mining can't do that because every thread is working in a totally different place in memory determined by the DAG. So normal applications will have lots of coalescing happening, mining will have zero.
Normal games or applications will have cache hits, because they're re-using at least some data frequently. Mining will have an (effectively) 0% cache hit rate because the DAG is sending threads to random places in memory and memory is much larger than cache.
These are simple things that can be metered with O(1) performance counters on the hardware. If the card sees a load like that, run in cripple mode, nuke the memory bus to 10% performance. Then you can also add the capability for a whitelist - the driver can attest that a certain binary has been signed by windows from the appropriate vendor, and TPM can attest that the driver and hardware hasn't been tampered with (Remote Attestation). So no need to worry about legacy code or DIY cuda code unless it happens to look like a mining application, and then you can whitelist any edge-cases.
TPM is going to be mandatory for OEM Windows 11 systems - home builders technically don't need it, but then if they happen to run some code that performs 100% random unaligned memory access you'd have to get it signed. But most code doesn't behave anything like that, so that is a real edge-case unless you are trying to write a miner.
You may be morally opposed to the above, but it's not impossible at a technical level, mining code actually looks nothing like normal code at a perfcounter level.