I found it! It turns out the whole PID is generated on the first encounter, and (for my Dunsparce) it's stored in two places:
If this is the first dunsparce you've seen, it's stored in the strategy memo (Colosseum's pokedex), along with some other info like the species national ID, and the TID and SID of the trainer using it. This is findable without digging through the save binary, since PkmGCSaveEditor can show you strategy memo details, so that's probably the way I'm going to do it to get my 3-segment. If you want to go through the save, my dunsparce's strategy memo data was 0x8554-0x855F, with the PID being 0x855C-0x855F (it looks like this offset will vary based on its position in the strategy memo, my dunsparce was entry #57)
Here's the exciting one, since this (to me) looks like the data of the snag list! My Dunsparce's PID is stored at 0x1B0F0-0x1B0F3. There's what looks like a lot of other PIDs around it in a list, which makes me think this is the snag list. (also the bit directly before the PID was changed from 0 to 1 after catching, so if I was placing bets I'd say that's the "snagged" flag). Unfortunately I can't see from a glance if the species ID is stored here, so it might take some work to actually decode this for general use.
I'll attach my saves here if anyone wants to take over and dig around for more insights (or make a plugin/add to PKHeX).
I'll also update here if the offsets are the same for my next run, where I actually reset till I get a compatible PID for a 3-segment. thx for coming to my ted talk
1 before encountering dunsparce decrypted.bin
1 before encountering dunsparce.gci
2 after encountering dunsparce decrypted.bin
2 after encountering dunsparce.gci
3 before catching dunsparce decrypted.bin
3 before catching dunsparce.gci
4 after catching dunsparce decrypted.bin
4 after catching dunsparce.gci