Here is my XML config: https://pastebin.com/8F9atB2N
I basically copied the OpenCore config verbatim from that git repo (https://github.com/Leoyzen/KVM-Opencore). Only change I made was to the serial numbers in the config.plist. Not loading any additional kext that aren't in that repo either.
No, not my host. I was creating a copy of the VM without a GPU attached for testing purposes and it failed to boot. It seems like libvirt changes the buses around when you remove/add devices.
For example, in the original config linked, the GPU I'm passing through is on bus 0x04. When I created a copy of the config and added a virtual VGA device, libvirt put it on bus 0x02 instead. For some reason that prevented macOS from booting properly. So I updated it to 0x04 to match my original config, and did the same for the NVMe drive. Then it booted fine.
BTW, my 970 Evo isn't the Plus version, there seems to be a difference. Do you have the latest firmware? Seems even those with actual Mac hardware were getting kernel panics with this drive, see here: https://bartechtv.com/samsung-releases-new-firmware-for-970-evo-plus-that-resolves-macos-compatibility-issues/