I've tried implementing the LocationDisplay, as you suggested, but it has its own set of quirks.
It has a habit of getting confused with the rotation and spinning "the long way around" as it animates from the previous rotation to the current rotation (very disorienting for the map to do a 200+ degree spin).
I believe it is also not compensating for device orientation (i.e. the map rotation is correct in portrait mode, but 90/180/270 degrees off when in landscape or upside-down portrait modes)... perhaps I could wrap the SystemLocationDataSource() to inject the device orientation offset into the headings, but I'm not sure the best approach for that. Swift is not my wheelhouse. (LocationDataSource is not able to be inherited by a custom class, so that isn't a solution). Until I can get this to function correctly in landscape orientation, it's not an option for this app.
That being said, even in portrait mode, I can't pinpoint exactly what's wrong, but the rotation component of the compassNavigation is just not behaving as I would expect, whereas my code using setViewpointRotation, feeding the heading+device orientation offset straight from CLLocationManager is working just fine, until it causes the map renderer to crash.