What is easier to understand
A última abordagem. Não é apenas mais fácil de entender, mas é mais fácil escrever, testar, refatorar e estender também. Cada condição exigida pode ser dissociada e manuseada de maneira segura.
it's problematic because you have to read all the methods to understand the code
Não é problemático se os métodos forem nomeados corretamente. Na verdade, seria mais fácil entender como o nome do método descreveria a intenção da condição.
Para um espectador if MatchesDefinitionId()
é mais explicativo do que if (propVal.PropertyId == context.Definition.Id)
[Pessoalmente, a primeira abordagem machuca meus olhos.]