You're doing too much programmatically. Rather than creating the whole UI setup you have, you should instead create all your layout and save it as a prefab. You should then create a single row entry for your list, and save that as a prefab as well. When populating the list programmatically, instantiate the row prefab, fill the data, rinse and repeat. This way everything will look and behave correctly, and you still get the whole "populated programmatically" deal.
As for locking up -- I don't see why it would ever lock up, so I can't advise you here. You might have to debug it via some careful Debug.Logs.