You can do it with client side scaling in X (which is also the preferred solution on systems like Windows, since an application can scale itself better than a generic compositor anyway).
The client is given an XConfigureEvent when it is moved and can compare it against the monitor's bounding boxes (which it caches in between xrandr change notifications) and rescale itself.
Doesn't work with legacy applications... but neither does Wayland so you aren't really behind.