Да, хороший вопрос, на самом деле.
В истории со списком я хранил и в адаптере и в презентере. Но это было скорее обусловлено тем, что пользователь мог выйти с экрана, а получать новые сообщения должен был. Поэтому я весь скоуп оставлял в живых. И когда появлялась вьюшка, то выдавал ей актуальный список.
Дифф то никакой не нужно искать. Вы же все проводите через презентер, и там всегда самая актуальная информация. А потом уже презентер выдает команды вьюшке, в том числе и отдает новые сообщения. А вьюшка их уже в адаптер и список.
Хотя можно адаптер и в презентер хранить. Но тогда получается, что мы скрытно управляем вьюшкой еще и через адаптер. Из-за этого очень легко можно запутаться. Ну и Single Responsobility как бы страдает
Презентер должен знать, в какие позиции вставляются элементы, чтобы вызвать нужные notify. Отсюда и необходимость в diff, как я это вижу. Что, если обновляются те строки, на которые сейчас смотрит пользователь? Или вы просто всегда вызывали notifyDataSetChanged?