Have a look at shiftOut() in the Arduino reference. You will see how a byte can be sent to a shift register to cause an LED connected to the output pins to be turned on or off. To achieve what you want to do you need to set the individual bits of the byte to be sent to the shift register before it is shifted out causing the LEDs to turn on/off.
Once you have got that principle working you can move on to fading the LEDs. A bit in a byte can only be on or off, of course, as can an LED, but if you turn a bit on/off for a varying length of time you get the appearance of the corresponding LED fading up/down.
The bitSet() function allows you to set a bit of a byte on or off so to fade an LED connected to bit 0 of the shift register you would do something like this pseudocode
set timeA to 1
set timeB to 255
start of loop
set dataByte to B00000001; //bit 0 turned on
send dataByte to the shift register //the LED will come on
wait for timeA
set dataByte to B00000000; //bit 0 turned off
send dataByte to the shift register //the LED will turn off
wait for timeB
go back round the loop
As timeA gets longer and timeB gets shorter the LED will be on longer and off less so will fade up. Obviously you need to check when it reaches the lower/upper limits and stop incrementing. In practice you would control the bit by setting/clearing it individually rather than setting the the whole byte and would use only one time variable but this way you can see what is going on very easily.
So, how do you deal with more than one bit and more than one LED ?
The first thing to do is to understand the BlinkWithoutDelay example which shows how to wait without using delay()
Now, instead of 'wait for timeX' in the code you substitute 'is it time to change the state of the LED'. If so, you do it, if not keep going round the loop until the time is up. Now you can add more checks in the loop to see whether any other bits of the byte need to be changed and, if so, change just that bit and output the byte once at the start or end of the loop.