Tu problema realmente no parece ser con PDO, dado que como dices te llega a insertar un valor. El problema es cómo estás construyendo el formulario.
Básicamente si puedes tener varios libros en el formulario, tienes que poner a cada uno de los campos de cada libro algo para que se diferencien los unos de los otros.
El problema en tu código es que todos los campos <input> del nombre del libro se llaman igual:
<input type='text' name='nombre' value='<?php echo $libro2->getNombre()?>'>
Eso no puede ser, porque entonces por mucho que tengas varios campos, lo que ocurre es que solamente te llega el valor de 1, que es justamente lo que estás percibiendo.
Tendrías que concatenar en el atriburo "name" el identificador del libro, para que el campo de formulario cambie el "name" para cada <input> y así puedas recibirlos todos.
<input type='text' name='nombre<?php echo $libro2->getId()?>' value='<?php echo $libro2->getNombre()?>'>
Otra alternativa es poner como unos corchetes en el name de los campos de texto <input>, lo que te asegurará que esos campos se envíen todos, tratándolos como un array, en cuyo caso los podrás recibir con un bucle.
<input type='text' name='nombre[]' value='<?php echo $libro2->getNombre()?>'>
Entonces para recibir todos los nombres usarás un bucle foreach, de esta manera.
foreach($_POST['nombre'] as $nombre) {
echo $nombre . '<br>';
}