Thanks, I think you nailed the actual symptom.
The Windows issue was not that the grid drawing code was especially slow in isolation. It was that during live window resizing, Avalonia could ask the Canvas to render at the new size before Objo had finished producing a fresh Paint() command buffer for that size.
Previously, the Canvas filled its newly resized bounds, then replayed the previous drawing commands, which had been generated for the old width and height. That could leave a newly exposed strip visible as white until the next Paint() completed. On macOS that repaint cycle tends to be fast enough that the artefact is not really visible.
The fix now records the size associated with each Canvas command buffer. If a resize-triggered repaint is already pending and Avalonia needs an intermediate render at a different size, the previous frame is temporarily scaled to cover the new bounds. As soon as the new Paint() handler completes, the Canvas returns to exact, unscaled drawing.
The practical result is that the grey grid keeps covering the window edge during drag resize instead of flashing a white border.
The only expected side effect is that during very fast resizing, the Canvas may briefly show a stretched version of the previous frame for a frame or two. That only happens while waiting for the real resize Paint(), and it is immediately replaced by the correct drawing once that paint completes. Explicit Canvas.Refresh() behaviour is unchanged.
This is fixed and marked for the next release: https://feedback.objo.dev/bug/392