After revisiting the code, I think I see why it isn't working in Windows Forms. ListBoxItem will start returning the new value from ToString(), but nothing tells the ListBox to refresh. I can think of two ways to fix this.
First, ListBoxItem could remove and replaced itself when the text changes. That should trigger a refresh. But it might mess with scrolling and selection.
Second, the UpdateListBox could have a dependent that touches the text of all items. When it updates, it could trigger a repaint. I'm not sure if this would work.
I'll try to get some time this week to look into it. In the meantime, you might want to try UpdateListView instead. I don't think it has the same problem.