Thanks for the report and the repro project, that's very clear.
This wasn't a mistake on your part: it was a behavioural difference between Xojo and Objo. In Xojo, PaintCellBackground() fires for every visible cell, including the empty cells below the last row (row indices run past RowCount). That's what lets g.FillRectangle(0, 0, g.Width, g.Height) colour the entire ListBox. In Objo, the event was only firing for rows that actually exist, which is why the area below your 3 rows stayed unpainted.
This is now fixed: https://feedback.objo.dev/bug/1084
Objo matches Xojo's behaviour. PaintCellBackground() is now also fired for the "phantom" cells filling the empty area below the last row, with row >= RowCount (and selected = False, hovering = False). Your original code will now colour the whole ListBox. Note that PaintCellText() is not fired for these empty cells.
If you'd rather keep the area below the rows unpainted (the old behaviour), just use the same guard Xojo requires:
# PaintCellBackground
If row >= Me.RowCount Then Return False
g.DrawingColour = Colour.Orange
g.FillRectangle(0, 0, g.Width, g.Height)
Return True