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.