All things are possible in WPF, one way or the other (or, usually, both, plus a bunch more).
The easy part first - if you've properly implemented INotifyPropertyChanged on the object in your array, bindings should update properly. INotifyCollectionChanged notifies you if elements in a collection have changed (i.e. been added/deleted).
It sounds like you are trying to update an unknown number (or even a known number, it doesn't really matter) of TextBlocks. Likely, the best way to do that is to use some kind of ItemsControl (ListBox is one) with an ItemsTemplate, and optionally the ItemsPanel. This will be the easiest way to maintain, in case the definition of the collection changes.
For instance, here is one ItemsControl example.
<ItemsControl x:Name="itemsExample"
ItemsSource="{Binding MyCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Stretch" IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding SomeStringProperty}" Grid.Column="0" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
If, however, you really do want to bind individual TextBlocks, one way you can do it by implementing IValueConverter. You would then bind each of your TextBlocks to the collection, and use a ConverterParameter with the appropriate index. The converter would then just return the value of a string at that index.
<TextBlock Text="{Binding MyCollection,
Converter={StaticResource myObjectConverter},
ConverterParameter=0}" />
If you are using MVVM, another possibility is to have properties for each of the elements of your array, and bind to those properties. However, if you are doing that, I would question the need for the array in the first place.