The reason for this is that you are updating the GUI fron outside of the main GTK thread.
The main GTK thread, who owns the event loop, is created when you call Gtk.Application.run .
Several methods are avalaible for updating, you could try Gtk.Application.Invoke,
Gtk.Application.Invoke (delegate {
double d = new Random().NextDouble();
for (int i = 0; i < 4; i++) {
((Label)((MenuItem)menu.Children[i]).Child).Text = d.ToString();
}
});
This link could be of interest.