Hello Andy,
Glad I was able to help and thanks for sharing the solution in forums - certainly will be helpful for other customer as well.
Just wanted to follow-up that I think I know what is going on under the hood and why SelectedRowChanged did not fire. This most probably has something to do with Page Lifecycle and events (Init, Load, PreRender, etc). Event handlers that are fired on postback like SelectedRowChanged need to be hooked in the OnInit state of the page (this is what the VS.NET designer does by default), whereas I believe in your case ItemBound for Repeater could be fired later on (by default it is in PreRender, if declarative datasource is used). This side-effect affects only SelectedRowChanged since it is a postback event, while InitializeLayout does not trigger postback - hence no problems.
The solution you are currently using seems to be the better one, if you do need to do it with code, you can force DataBinding the Repeater in the page OnInit event (by calling Repeater1.DataBind() explicitly in the OnInit event of the page)
Hope this helps.