Tradicional grep
é orientado para linha. Para fazer correspondências com várias linhas, você precisa enganá-lo para que o arquivo inteiro seja sugado, informando que sua entrada é terminada com null, por exemplo.
grep -zPo '(?s)\nif.*\nendif' file
ou use uma ferramenta mais flexível, como pcregrep
pcregrep -M '(?s)\nif.*?\nendif' file
ou o próprio perl
perl -00 -ne 'print if m/^if.*?endif/s' file
Como alternativa, para corresponder a entrada estruturada de uma maneira semelhante ao grep, há sgrep
sgrep '"if" .. ("endif") containing "SOME CODE"' file