A practical approach that in many examples works (but not always, I know) is trying to find the nesting structure of the strings in the language. “Nested dependencies” have to be generated at the same time in different parts of the string.
Also we have the basic toolbox:

concatenation: $Sto S_1S_2$ if you can split the language in two consecutive parts use this production

union: $Sto S_1 mid S_2$ split into disjoint parts

iteration: $Sto S_1S mid varepsilon$
Example 1
Unequal numbers can be handled using a simple trick.
$L= { a^mb^n mid mneq n }$
Now clearly
$L= { a^mb^n mid m< n } cup { a^mb^n mid m> n }$.
Consider first half: $L_1 = { a^mb^n mid m< n }$. If there must be more $b$‘s we can generate an equal numbers of $a$‘s and $b$‘s on the one and and add at least one extra $b$:
$L_1 = { a^mb^m b^i mid mge 0, i>0 } = { a^mb^m mid mge 0 }cdot { b^i mid i>0}$. This we can handle with concatenation from the basic toolbox.
Now the complete language also deal with the case we have more $a$‘s. This we handle by using union.
$S to S_1 mid S_2$ (choose which part)
$S_1 to XB$ (extra $b$ part)
$Xto aXbmid varepsilon$ (equal number of $a$ and $b$)
$B to Bb mid b$ (one or more $b$‘s)
$S_2 to AX$ (extra $a$ part)
$A to Aa mid a$ (one or more $a$‘s)
Example 2
Here an example for the nesting (thank you Raphael).
$L={b^ka^l(bc)^ma^nb^o mid k,l,m,n,oin {Bbb N},kneq o,2l=n,mge 2 }$
Replace $n$ by $2l$. We can now drop $n$ in conditions.
Replace $k neq o$ by $k > o text{ or } k < o$ (confused? $o$ is ‘oh’ not ‘zero’). Apply tools for union. We work with $k > o$ here. Also $k>o$ iff $k=s+o$ and $s>0$ where $s$ is a new variable. Replace $k$ by $s+o$.
$L_1 ={b^{s+o}a^l(bc)^ma^{2l}b^o mid l,m,o,sin {Bbb N},s>0,mge 2 }$
Some simple rewrites.
$L_1 ={bb^sb^o a^l bcbc(bc)^m (aa)^{l}b^o mid l,m,o,sin {Bbb N} }$
Now we see the nesting structure, and start building a grammar.
$S_1 to TV$, $Tto bU$, $Uto bU mid varepsilon$ (see: concatenation and iteration here)
$V to bVb mid W$ (we generate $o$ $b$‘s on both sides)
$W to aWaamid X$
$Xto YZ$, $Yto bcbc$, $Zto bcZmid varepsilon$
Example 3
$K ={ a^kb^lc^m mid l=m+k}$
A first “obvious” rewrite.
$K ={ a^kb^{m+k}c^m mid m,kge 0} = { a^kb^mb^kc^m mid m,kge 0}$
In linguistice this is called “crossserial dependency”: the interleaving $k,m,k,m$ (usually) strongly indicates noncontextfreeness. Of course $m+k=k+m$ and we are saved.
$K ={ a^kb^{k+m}c^m mid m,kge 0} = { a^kb^kb^mc^m mid m,kge 0}$
with productions $Sto XY$, $Xto aXbmid varepsilon$, $Yto bYcmid varepsilon$
Similarly $K’= { a^kb^lc^m mid m=k+l} = { a^kb^lc^lc^k mid k,lge 0}$
with productions $Sto aSc mid X$, $Xto bXcmid varepsilon$
Final comment: these techniques help you come up with a candidate contextfree grammar that will hopefully recognize your language. A correctness proof may still be needed, to ensure that the grammar really works to recognize your language (nothing more, and nothing less).