While what you want CAN be done with proc transpose, I typically prefer using proc summary to accomplish the task.  You can avoid the proc sql code, below, if you know that maximum number of rate/payments that you'll confront.  It is only included to count them:
data have;
  input ProvID Company $ Rate Payment;
  cards;
1234 CompA 20.2 100.00
1234 CompA 30.5 200.00
1234 CompA 40.7 300.00
1234 CompB 20.2 150.00
1234 CompB 50.5 250.00
;
run;
* Get magic number;
proc sql noprint;
  select max(obs) into :obs
    from (select count(*) as obs
      from have
        group by ProvID,Company)
;
quit;
* transpose to wide;
proc summary nway data=have missing;
  class ProvID Company;
  output
  out = want(drop=_type_ _freq_)
  idgroup(out[&obs](Rate Payment)=)
;
run;
HTH,
Art