There are several ways (as usual) to do what you describe.
Please note that use
Texture2D textures[10];
will not allow you to use the variable index to search in Pixel Shader (since technically this ad will highlight the slot on the texture).
So you need to create a Texture2DArray. This is a bit like the texture of a volume, but the z component is a full number and there is no selection on it.
You will need to create this texture array. An easy way to start is when you make a one-time quad-core call to draw each texture into a slice of an array (you can create a RenderTargetView for a specific fragment). The shader will be a simple walkthrough here.
To create an array of textures (the code is in SlimDX, but the parameters are similar):
var texBufferDesc = new Texture2DDescription { ArraySize = TextureCount, BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, CpuAccessFlags = CpuAccessFlags.None, Format = format, Height = h, Width = w, OptionFlags = ResourceOptionFlags.None, SampleDescription = new SampleDescription(1,0), Usage = ResourceUsage.Default, };
Then the presentation of the shader resources is as follows:
ShaderResourceViewDescription srvd = new ShaderResourceViewDescription() { ArraySize = TextureCount, FirstArraySlice = 0, Dimension = ShaderResourceViewDimension.Texture2DArray, Format = format, MipLevels = 1, MostDetailedMip = 0 };
Finally, to get the rendering target for a specific fragment:
RenderTargetViewDescription rtd = new RenderTargetViewDescription() { ArraySize = 1, FirstArraySlice = SliceIndex, Dimension = RenderTargetViewDimension.Texture2DArray, Format = this.Format };
Bind this to your encrypted shader, set the desired texture as input and slice as output, and draw a full-screen square (or full-screen triangle).
Please note that this texture can also be saved in dds format (therefore, it saves you when restoring every time you start your program).
The texture search is as follows:
Texture2DArray myarray;
In the pixel shader:
myarray.Sample(mySampler, float2(uv,SliceIndex);
Now about rendering sprites, you also have the option of expanding GS.
So, you create a vertex buffer containing only the position / size / texture index / all you need, one vertex per sprite.
Send a draw call using n sprites (Topology must be set to a list of points).
Paste data from the vertex shader into the geometric shader.
Expand your point to a square in the geometric shader, you can find an example that ParticlesGS in the Microsoft SDK does, it will outsmart for your business, since you only need a part of the rendering, not animation. If you need some sort of cleaned code, let me know, I will quickly make a dx10 compatible sample (in my case I use StructuredBuffers instead of VertexBuffer)
Executing a pre-made Square and transferring the above data to Per Instance VertexBuffer is also possible, but if you have a large number of sprites, it will easily blow your graphics card (by and large, I mean something like more than 3 million particles, which is currently not there are so many, but if you have less than half a million sprites, you will be completely fine;)