Ваше решение должно работать как есть. В вашем коде есть одна небольшая хитрость - вы вызываете асинхронный метод на сервере, а после этого связываете событие OnCompleted. Если вызов сверхбыстрый и заканчивается до того, как событие будет связано, вы не увидите сущностей.
По моему опыту, это никогда не было проблемой (в 99,99% случаев это работает нормально), но просто для того, чтобы иметь чистый код, вы можете предоставить обратный вызов внутри метода Load, например
proxy.Load(proxy.GetPresentationsQuery(), op => { here work with op.Value });
Подсказка: для загрузки сущностей в ObservableCollection я создал собственный класс, производный от ObservableCollection, который принимает DomainContext и DomainQuery в качестве параметров в ctor и способен загружать элементы с самого сервера. Кроме того, можно связать коллекцию в XAML, а загруженные объекты автоматически обновляются в графическом интерфейсе.