Alright, I think this is good enough. Forget about what I said earlier. Seems you can change SX in Mode 2, Mode 3, and Mode 0 and still have it take effect on the next line. Not being able to get it working on HBlank was just my bad coding
Anyway, it's simple. The test ROM just shifts a fullscreen pattern by 0 or 1 every other line (the original pattern is already shifted every other line, so SX changes "correct" it). The result should create a series of vertical bars. The source code is attached as well as the ROM. Nothing fancy, but I've messed around with the OAM-STAT IRQ a few times to get it working with Modes 2, 3, and 0. Same result on real hardware. Nothing changes on the current line, just the next one. My guess is the latched value for SX is determined between the end of Mode 0 and the start of Mode 2.