Why does all this work need to get done in the constructor for every instance that is created. Consider list item widgets in lists with hundreds of items or grids with item widgets that have multiple child widgets, and we're starting to rely heavily on these bindings features.

Because the bindings are declared at the class level, this is an opportunity to compute things that stay the same as long as the bindings remain unchanged. Since the bindings are declared through the feature declaration method on the class, this method can perform the optimization prep that makes this kind of code run blazingly fast in the construction of instances. For instance, you could do this nested loop and unroll into a flat array. And you don't need to get the values every time.