Pascal, 128 bytes
=================

One recursive procedure takes care of everything.

    procedure m(i,j:integer);begin if i<1then Exit;if i=j then begin m(i-1,j-1);writeln;end;m(i-1,j);write(i,'x',j,'=',i*j,' ');end;

Ungolfed:

    procedure mul(i, j: integer);
    begin
      if i<1 then
        Exit;
      if i=j then
      begin
        mul(i-1, j-1);
        writeln;
      end;
      mul(i-1, j);
      write(i,'x',j,'=',i*j,' ');
    end;