- Patterns in [`Alternatives`](http://reference.wolfram.com/mathematica/ref/Alternatives.html) are tried in order
- Only the first pattern that matches is "applied" to the expression.
- `Cases` does not support multiple patterns outside of `Alternatives`.

I suppose it could be interesting to debate that design decision but nevertheless that's the way it works at this time.

You could of course search with multiple passes:

 expr = f[x, g[y], z]
 pat = h_[c_] | h_[c_, __] | h_[__, c_, __] | h_[__, c_];

 Join @@ (Cases[expr, # :> h -> c, {0, -1}] & /@ List @@ pat)

> {g -> y, f -> x, f -> g[y], f -> z}

Or using `ReplaceList` and `Level`:

 rules = # :> h -> c & /@ List @@ pat
 Join @@ (ReplaceList[#, rules] & /@ Level[expr, {0, -1}])