If I use JRemote and select CXN as the output device I lose gapless, so my bet would be that the JRemote app is the culprit not JRiver per se
That is certainly an inspired guess.
The theory: In UPnP it is the Control Point (and not the Server) that pushes the track play commands to the Renderer. And the Control Point may choose to use either gapped or gapless command mechanisms. So even it the tracks are coming off the same Server, and going to the same Renderer, the gapped / gapless functionality will depend on which CP is used.
The practice: We know that when MC is acting as CP and Server then it can definitely push gapless. However I am not entirely sure how JRemote functions (I need to check), but there are two possibilities, either a) it is acting in its own right as a UPnP Control Point (in which case it may well be that JRemote does not support gapless), or (which I think is the real case) b) it is acting as a proxy to MC and not actually controlling the track play process directly but rather adding the tracks to the MC playlist and telling MC to execute the Control Point functions (in which case whether JRemote or MC is creating the playlist should have no impact on gapless functionality).
I could test this myself if it is (a) or (b), but only next week. So if anyone has the answer already, please post it here