Hi Andrew,
Looking over your example I noticed two things: first that you are performing your search using a recycling cursor, which reuses the underlying set of values as the rows are iterated. This bug would cause the issue you are seeing (each iteration causes the values in referencing rows to shift in concert).
However, while tracing through I noted that non-recycling cursors behave as recycling cursors. We'll be reviewing how to remedy this bug.
In the meantime my recommendation would be to treat the row in side the loop as ephemeral and copy its values out to your own cached value objects.
Tom