what i need is a whiteboard. :)
i'll assume 8-bit data. so i'm picturing 2 LUT (256x8-bit), one for overexposed and one for underexposed. both LUT have extreme correction values in them, the most you'd want to correct in either direction.
to get less correction do a weighted average between one LUT and the linear/no-change curve. so:
output_value = weight*LUT[input_num] + (1-weight)*input_num
where:
-input_num is the input pixel value
-LUT[input_num] is the lookup table value associated with the input pixel value
-weight is the weighting factor, how much correction to apply
-output_value is your output pixel value
so your weight width will depend on how many "settings" you want, how fine the tuning is. if you only want 4 settings of underexposure/overexposure correction you need 2 bits, etc. just take the 8 MSB to truncate or add some logic to round if that's more desirable.
i'm sure there are better methods, but this one's cheap and easy. i'm not sure how well the linear interpolation of the LUT is going to work in application, but its worth trying.