Think about it this way: having a list where the first element is called 'x' and the rest of the list is called 'xs' (in Haskell, this would be written as (x:xs)), you either prepend your given value to the list of the position is 0. Otherwise you call yourself recursively on the remained of the list (and decrease the poisition).
putinto :: Int -> a -> [a] -> [a]
putinto 0 value list = value : list
putinto n value (x:xs) = x : putinto (n-1) value xs
In case it looks odd, the (x:xs) is actually a "deconstructed" list. The x represents the first element of the list, xs (the 's' means 'plural', so it's the plural of 'x') is the rest of the list.
So calling it with a zero will actually prepend the given value, as in
putinto 0 'a' "haskell" -- yields 'ahaskell'
Calling it with two will be:
putinto 2 'a' "haskell"
-- same as 'h' : putinto 1 'a' "askell"
-- same as 'h' : 'a' : putinto 0 'a' "skell"
-- same as 'h' : 'a' : 'a' : "skell"
-- same as "haaskell"
You still need to care about error checking (what if the given position is negative, or larger than the list length?) though.