Hello Jakub,
the behaviour is correct.
In your implementation you create rectangle views with vertical position incremented for each new view. At the same time you invoke EnsureVisible() method to scroll the already existing views. With the scrolling, the existing views are moved vertically - their Bounds value is adapted. The new views, however, ignore the already performed scrolling. They calculate a position as if there were no scrolling performed.
What can you do:
Add the actual scrolling in the calculated position of the just created view:
Best regards
Paul Banach