Grid подразумевает размещение элементов в определённой сетке или равномерно по экрану. Он, по умолчанию, не предполагает прокрутки. Поэтому его нужно использовать для размещения известного количества известных элементов.
StackPanel располагает элементы подряд. При превышении размера используется прокрутка. Элементы могут быть разного типа. В StackPanel каждым добавленным элемент нужно управлять индивидуально.
ItemsControl по сути похож на StackPanel, но тут мы имеем централизованное управление элементами - через Items или ItemsSource.
ListBox добавляет к ItemsControl возможность выделять элементы.
Это весьма общая классификация: с помощью свойств, обработчиков, шаблонов можно при большом желании превратить одно в другое.
В вашем случае, в зависимости от логики приложения можно предложить следующее.
Если диалоги у вас в программе представлены списком (лучше BindingList или ObservableCollection), то их располагать в ItemsControl со StackPanel в качестве ItemsPanel. В шаблон элемента вы добавляете название, фотографию диалога и ListBox с сообщениями.
Если не хотите заморачиваться с ItemsControl, то тогда использовать StackPanel, но тогда при добавлении диалога вам вручную придётся добавлять элементы для названия, фото и собщений.
Можно ещё рассмотреть вариант с использованием TreeView, где в качестве первого уровня будут диалоги, а второго уровня - сообщения. Автоматом получаете закрытие/открытие диалогов.