A table lookup could work, but your resolution would be limited by table size. If that's OK (you don't necessarily NEED a ton of resolution, it depends on the application), then you can absolutely go for a table lookup method. It's fast to look something up in a table, but can be annoying to put a large lookup table together manually.
You can make the relationship between the ADC value and the PWM DC any mathematical relationship you want. If you want a simple scale from one range to another this map macro may be of use.
#define map(x,in_min,in_max,out_min,out_max) ((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
So for something like a 10-bit ADC and a PWM with a period value of 5000:
#define MIN_ADC_VAL 0
#define MAX_ADC_VAL 1024
#define MIN_PWM_DC 0
#define MAX_PWM_DC 5000
uint16_t pwm_val,adc_val;
adc_val = Read_ADC();
pwm_val = map(adc_val,MIN_ADC_VAL,MAX_ADC_VAL,MIN_PWM_DC,MAX_PWM_DC);
This would scale your input value to an equal point on your output range.